# onjie1204/hiddenmy architecture

> Architecture diagram of the GitHub repository onjie1204/hiddenmy, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/onjie1204/hiddenmy
- Repository: https://github.com/onjie1204/hiddenmy

## Overview

This Laravel application supports discovering and contributing Malaysian hidden gems, then building travel posts and itineraries around places. The browser client routes users through authentication, maps, gem details and submissions, and travel planning; feature API modules communicate with Laravel endpoints. On the server, controllers implement domain actions over relational models, with integrations for storage and geographic data. Community reports and votes, user achievements, and account features are parallel capabilities. The README is empty, and sampled controller excerpts are partial, so some subsystem wiring is omitted.

Main entry points: [`laravel/app/Models/Location.php`](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Models/Location.php) (Domain models), [`laravel/routes/api.php`](https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api.php) (API routes), [`laravel/resources/js/App.jsx`](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/App.jsx) (App router), [`laravel/app/Http/Controllers/HiddenGems/HiddenGemController.php`](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/HiddenGems/HiddenGemController.php) (Gem management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web client"]
  node_app["App router<br/>[App.jsx]"]
  node_gem_pages["Gem pages<br/>[HiddenGems.jsx]"]
  node_gem_api["Gem API client<br/>[api.js]"]
  node_travel_pages["Travel pages<br/>[TravelPosts.jsx]"]
  node_travel_api["Travel API client<br/>[travelPostsApi.js]"]
  node_auth_pages["Account pages<br/>[Login.jsx]"]
  node_auth_api["Account API client<br/>[api.js]"]
end

subgraph group_gems["Hidden gems"]
  node_gem_routes["Gem routes<br/>[hidden-gems.php]"]
  node_gem_controller["Gem management"]
  node_search["Gem search"]
  node_osm_sync["OSM attraction sync"]
  node_overpass["Overpass client<br/>[OverpassClient.php]"]
  node_geo_cache["Attraction cache"]
end

subgraph group_travel["Travel planning"]
  node_travel_routes["Travel routes<br/>[travel.php]"]
  node_travel_controller["Travel posts"]
  node_itinerary_controller["Itineraries"]
end

subgraph group_platform["Accounts and community"]
  node_api_routes["API routes<br/>[api.php]"]
  node_auth_routes["Auth routes<br/>[auth.php]"]
  node_auth_controller["Authentication<br/>[AuthController.php]"]
  node_community_controller["Community reports"]
  node_achievement_service["Achievements"]
  node_models["Domain models<br/>[Location.php]"]
  node_database[("Relational database")]
  node_storage["Object storage"]
end

node_traveler(("Traveler"))
node_supabase[("Supabase storage")]
node_osm["OpenStreetMap"]

node_traveler -->|"uses"| node_app
node_app -->|"routes to"| node_gem_pages
node_app -->|"routes to"| node_travel_pages
node_app -->|"routes to"| node_auth_pages
node_gem_pages -->|"requests data"| node_gem_api
node_travel_pages -->|"requests data"| node_travel_api
node_auth_pages -->|"requests account"| node_auth_api
node_gem_api -->|"calls API"| node_api_routes
node_travel_api -->|"calls API"| node_api_routes
node_auth_api -->|"calls API"| node_api_routes
node_api_routes -->|"loads routes"| node_gem_routes
node_gem_routes -->|"dispatches"| node_gem_controller
node_api_routes -->|"loads routes"| node_travel_routes
node_travel_routes -->|"dispatches"| node_travel_controller
node_travel_routes -->|"dispatches"| node_itinerary_controller
node_api_routes -->|"loads routes"| node_auth_routes
node_auth_routes -->|"dispatches"| node_auth_controller
node_gem_controller -->|"reads and writes"| node_models
node_travel_controller -->|"reads and writes"| node_models
node_itinerary_controller -->|"reads and writes"| node_models
node_auth_controller -->|"manages users"| node_models
node_models -->|"persists records"| node_database
node_gem_controller -->|"uploads photos"| node_storage
node_travel_controller -->|"uploads photos"| node_storage
node_storage -->|"stores objects"| node_supabase
node_osm_sync -->|"fetches attractions"| node_overpass
node_overpass -->|"queries data"| node_osm
node_osm_sync -->|"updates cache"| node_geo_cache
node_gem_controller -->|"searches gems"| node_search
node_community_controller -->|"records reports and votes"| node_models
node_achievement_service -->|"tracks achievements"| node_models

click node_app "https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/App.jsx"
click node_gem_pages "https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/pages/hidden-gems/HiddenGems.jsx"
click node_gem_api "https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/features/hidden-gems/api.js"
click node_travel_pages "https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/pages/travel/TravelPosts.jsx"
click node_travel_api "https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/features/travel/travelPostsApi.js"
click node_auth_pages "https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/pages/auth/Login.jsx"
click node_auth_api "https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/features/auth/api.js"
click node_api_routes "https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api.php"
click node_gem_routes "https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api/hidden-gems.php"
click node_gem_controller "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/HiddenGems/HiddenGemController.php"
click node_search "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Services/HiddenGems/HiddenGemSearch.php"
click node_osm_sync "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Console/Commands/HiddenGems/SyncOsmAttractions.php"
click node_overpass "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Integrations/OpenStreetMap/OverpassClient.php"
click node_geo_cache "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Services/HiddenGems/OsmAttractionCache.php"
click node_travel_routes "https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api/travel.php"
click node_travel_controller "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/Travel/TravelPostController.php"
click node_itinerary_controller "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/Travel/TripItineraryController.php"
click node_auth_routes "https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api/auth.php"
click node_auth_controller "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/Auth/AuthController.php"
click node_community_controller "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/HiddenGems/ReportController.php"
click node_achievement_service "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Services/Achievements/SpecialAchievementService.php"
click node_models "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Models/Location.php"
click node_storage "https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Integrations/Storage/SupabaseStorage.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_gem_pages,node_gem_api,node_travel_pages,node_travel_api,node_auth_pages,node_auth_api toneBlue
class node_gem_routes,node_gem_controller,node_search,node_osm_sync,node_overpass,node_geo_cache,node_supabase toneAmber
class node_travel_routes,node_travel_controller,node_itinerary_controller toneMint
class node_api_routes,node_auth_routes,node_auth_controller,node_community_controller,node_achievement_service,node_models,node_database,node_storage toneRose
class node_traveler,node_osm toneIndigo
```

## Components

### Web client

- [App router](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/App.jsx): `laravel/resources/js/App.jsx`
- [Gem pages](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/pages/hidden-gems/HiddenGems.jsx): `laravel/resources/js/pages/hidden-gems/HiddenGems.jsx`
- [Gem API client](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/features/hidden-gems/api.js): `laravel/resources/js/features/hidden-gems/api.js`
- [Travel pages](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/pages/travel/TravelPosts.jsx): `laravel/resources/js/pages/travel/TravelPosts.jsx`
- [Travel API client](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/features/travel/travelPostsApi.js): `laravel/resources/js/features/travel/travelPostsApi.js`
- [Account pages](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/pages/auth/Login.jsx): `laravel/resources/js/pages/auth/Login.jsx`
- [Account API client](https://github.com/onjie1204/hiddenmy/blob/main/laravel/resources/js/features/auth/api.js): `laravel/resources/js/features/auth/api.js`

### Hidden gems

- [Gem routes](https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api/hidden-gems.php): `laravel/routes/api/hidden-gems.php`
- [Gem management](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/HiddenGems/HiddenGemController.php): `laravel/app/Http/Controllers/HiddenGems/HiddenGemController.php`
- [Gem search](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Services/HiddenGems/HiddenGemSearch.php): `laravel/app/Services/HiddenGems/HiddenGemSearch.php`
- [OSM attraction sync](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Console/Commands/HiddenGems/SyncOsmAttractions.php): `laravel/app/Console/Commands/HiddenGems/SyncOsmAttractions.php`
- [Overpass client](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Integrations/OpenStreetMap/OverpassClient.php): `laravel/app/Integrations/OpenStreetMap/OverpassClient.php`
- [Attraction cache](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Services/HiddenGems/OsmAttractionCache.php): `laravel/app/Services/HiddenGems/OsmAttractionCache.php`

### Travel planning

- [Travel routes](https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api/travel.php): `laravel/routes/api/travel.php`
- [Travel posts](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/Travel/TravelPostController.php): `laravel/app/Http/Controllers/Travel/TravelPostController.php`
- [Itineraries](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/Travel/TripItineraryController.php): `laravel/app/Http/Controllers/Travel/TripItineraryController.php`

### Accounts and community

- [API routes](https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api.php): `laravel/routes/api.php`
- [Auth routes](https://github.com/onjie1204/hiddenmy/blob/main/laravel/routes/api/auth.php): `laravel/routes/api/auth.php`
- [Authentication](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/Auth/AuthController.php): `laravel/app/Http/Controllers/Auth/AuthController.php`
- [Community reports](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Http/Controllers/HiddenGems/ReportController.php): `laravel/app/Http/Controllers/HiddenGems/ReportController.php`
- [Achievements](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Services/Achievements/SpecialAchievementService.php): `laravel/app/Services/Achievements/SpecialAchievementService.php`
- [Domain models](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Models/Location.php): `laravel/app/Models/Location.php`
- **Relational database**
- [Object storage](https://github.com/onjie1204/hiddenmy/blob/main/laravel/app/Integrations/Storage/SupabaseStorage.php): `laravel/app/Integrations/Storage/SupabaseStorage.php`

### Other components

- **Traveler**
- **Supabase storage**
- **OpenStreetMap**

## Connections

- Traveler → App router: uses
- App router → Gem pages: routes to
- App router → Travel pages: routes to
- App router → Account pages: routes to
- Gem pages → Gem API client: requests data
- Travel pages → Travel API client: requests data
- Account pages → Account API client: requests account
- Gem API client → API routes: calls API
- Travel API client → API routes: calls API
- Account API client → API routes: calls API
- API routes → Gem routes: loads routes
- Gem routes → Gem management: dispatches
- API routes → Travel routes: loads routes
- Travel routes → Travel posts: dispatches
- Travel routes → Itineraries: dispatches
- API routes → Auth routes: loads routes
- Auth routes → Authentication: dispatches
- Gem management → Domain models: reads and writes
- Travel posts → Domain models: reads and writes
- Itineraries → Domain models: reads and writes
- Authentication → Domain models: manages users
- Domain models → Relational database: persists records
- Gem management → Object storage: uploads photos
- Travel posts → Object storage: uploads photos
- Object storage → Supabase storage: stores objects
- OSM attraction sync → Overpass client: fetches attractions
- Overpass client → OpenStreetMap: queries data
- OSM attraction sync → Attraction cache: updates cache
- Gem management → Gem search: searches gems
- Community reports → Domain models: records reports and votes
- Achievements → Domain models: tracks achievements
