managarten/apps/citycorners/CLAUDE.md
Till JS 22a73943e1 chore: complete ManaCore → Mana rename (docs, go modules, plists, images)
Final cleanup of references missed in previous rename commits:

- Dockerfiles: PUBLIC_MANA_CORE_AUTH_URL → PUBLIC_MANA_AUTH_URL
- Go modules: github.com/manacore/* → github.com/mana/* (7 go.mod files)
- launchd plists: com.manacore.* → com.mana.* (14 files renamed + content)
- Image assets: *_Manacore_AI_Credits* → *_Mana_AI_Credits* (11 files)
- .env.example files: ManaCore brand strings → Mana
- .prettierignore: stale apps/manacore/* paths → apps/mana/*
- Markdown docs (CLAUDE.md, /docs/*): mana-core-auth → mana-auth, etc.

Excluded from rename: .claude/, devlog/, manascore/ (historical content),
client testimonials, blueprints, npm package refs (@mana-core/*).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 12:26:10 +02:00

4.3 KiB

CityCorners

Open platform for city guides worldwide — users create cities and add locations, growing the platform organically from the community.

Live URLs

Service URL
Web App https://citycorners.mana.how
Landing https://citycorners-landing.pages.dev

Architecture

apps/citycorners/
├── apps/
│   ├── landing/     # Astro static site (Tailwind, Cloudflare Pages)
│   └── web/         # SvelteKit web app (port 5196 dev, 5022 prod)
└── CLAUDE.md

Tech Stack

  • Data Layer: Local-first via @mana/local-store (Dexie.js/IndexedDB)
  • Sync: mana-sync (Go, WebSocket) for server synchronization
  • Web: SvelteKit 2, Svelte 5 runes, Tailwind 4, OpenStreetMap embeds, svelte-i18n (DE/EN), PWA
  • Landing: Astro 5, Tailwind 3, static site generation
  • Auth: mana-auth (JWT, guest mode supported)

Development

# Full stack (auth + web)
pnpm dev:citycorners:full

# Individual apps
pnpm dev:citycorners:landing
pnpm dev:citycorners:web

Data Model (Local-First)

Three IndexedDB collections managed by @mana/local-store:

Cities

  • id (string, PK)
  • name (string) — city/village/town name
  • slug (string, indexed) — URL-friendly name
  • country (string, indexed)
  • state (string, optional) — state/region
  • description (string, optional)
  • latitude (number) — center coordinates
  • longitude (number)
  • imageUrl (string, optional)
  • createdBy (string, optional) — user ID

Locations

  • id (string, PK)
  • cityId (string, indexed, FK → cities)
  • name (string, indexed)
  • category (enum, indexed: sight/restaurant/shop/museum/cafe/bar/park/beach/hotel/event_venue/viewpoint)
  • description (string, optional)
  • address (string, optional)
  • latitude/longitude (number, optional)
  • imageUrl (string, optional)
  • timeline (JSON array of {year, event}, optional)

Favorites

  • id (string, PK)
  • locationId (string, indexed, FK → locations)

Web App Routes

Route Description
/ City discovery — search & browse cities
/add-city Create a new city (auth required)
/cities/:slug City home — location grid with category filters
/cities/:slug/map OpenStreetMap with location list
/cities/:slug/add Add a location to city (auth required)
/cities/:slug/locations/:id Location detail with map, timeline, nearby
/cities/:slug/locations/:id/edit Edit location (creator only)
/favorites User's saved locations
/settings Theme mode/variant, account, about
/login, /register Auth via shared-auth-ui
/offline PWA offline fallback

Features

  • Multi-City Platform: Users create cities/villages and add locations within them
  • Local-First: All CRUD via IndexedDB, works offline, syncs to server
  • Guest Mode: Browse with seed data (Konstanz, Zürich, Berlin)
  • PWA: Installable, offline fallback, service worker caching
  • i18n: German + English, language switcher
  • Context-Aware Navigation: Nav items change based on city context
  • Categories: 11 location types with color-coded markers
  • Favorites: Heart button on cards, auth-gated
  • Geocoding: Auto-coordinates from city/address names (Nominatim)
  • Slug Generation: Auto-generated URL-safe slugs with umlaut handling

Categories

DB Value Label (DE) Label (EN) Marker Color
sight Sehenswürdigkeit Sight Blue
restaurant Restaurant Restaurant Red
shop Laden Shop Green
museum Museum Museum Purple
cafe Café Café Amber
bar Bar Bar Orange
park Park Park Emerald
beach Strandbad Beach Cyan
hotel Hotel Hotel Indigo
event_venue Veranstaltungsort Event Venue Pink
viewpoint Aussichtspunkt Viewpoint Sky

Docker

  • Web: apps/citycorners/apps/web/Dockerfile (multi-stage, port 5022 prod)
  • docker-compose.macmini.yml: Web service with health check

Environment Variables

Variable Used by Description
PUBLIC_MANA_AUTH_URL Web Auth service URL (client)
PUBLIC_SYNC_SERVER_URL Web mana-sync WebSocket URL