MusePicker is a metasearch platform for cultural activity tickets (museums, galleries, theatre, attractions) with price comparison and affiliate outbound routing.
- Web (test):
https://musepicker.shimyunbo.com - API (test):
https://api.musepicker.shimyunbo.com - Apex
shimyunbo.com: unchanged during MusePicker test launch
- Web: Vercel Hobby (
apps/web) - API + DB: OCI Always Free VM + Docker Compose (
apps/api+ MySQL) - DNS/Edge: Cloudflare Free
apps/web: Next.js frontend (App Router, React Query, URL-driven filters)apps/api: Spring Boot API (v1 public contract, MUALBA split-ready schema)apps/ingest: Python ingestion workers (API-first adapters + scraper fallback)packages/contracts: OpenAPI + JSON Schemasinfra: Infrastructure and CI/CD scaffolding
- Monorepo structure created and wired (
web,api,ingest,contracts,infra). - API v1 contract added in
packages/contracts/openapi/musepicker-v1.yaml. - Spring API scaffolded with split-ready DB boundaries:
core_*: private operational entitiesmualba_*: canonical standard entitiessource_*: raw ingestion payloads and mapping
- Next.js web scaffolded with:
- URL-driven filters
- React Query server-state
- Search/detail pages
- Affiliate outbound redirect tracking route
- Ingestion workers scaffolded with:
- API-first adapters (
klook,tripcom,ticketstodo,viator) - scraper fallback adapter
- retries/backoff, idempotency, snapshot persistence, health metrics
- dead-letter store, replay flow, canonical mapping confidence/review queue
- contract/idempotency/data-quality test suite
- API-first adapters (
- Root CI workflows added:
- security checks
- OpenAPI contract validation
- JSON schema validation
- API/web/ingest build-test gates
- migration naming gate
The historical prototype repositories are legacy-only.
Those legacy repos are:
musepicker_backmusepicker_frontmusepicker_front_nextjsmusepicker_scraper
Active development moved to:
bannangco/musepicker- https://github.com/bannangco/musepicker
Do not treat the legacy repos as production-ready services.
cd apps/api
./gradlew bootRuncd apps/web
npm install
npm run devcd apps/ingest
python3 -m venv .venv
source .venv/bin/activate
pip install -e .[dev]
python -m musepicker_ingest.pipeline.run_ingest --source klook --fixture tests/fixtures/klook_museum_list.sample.json --dry-run- No secrets should be committed in source control.
- Use environment variables or secret manager integration for runtime config.
- GitHub Actions must use OIDC and protected environments.
- See
SECURITY_INCIDENT_RESPONSE.mdfor the removed legacy exfiltration workflow response checklist.
docs/architecture.md: rebuild architecture and reuse decisionsdocs/governance/: policies, ADR, quality gatesdocs/operations/: monitoring, launch gates, post-launch loopdocs/operations/SHIMYUNBO_FIRST_LAUNCH.md: DNS, Vercel, OCI, GitHub deploy setup checklistdocs/PROJECT_CONTEXT.md: long-lived project memory for new Codex/ChatGPT sessions