Files
rose-ash/CLAUDE.md
giles 3bc5de126d
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 4m38s
Add cache busting instruction for sx.js to CLAUDE.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 23:03:51 +00:00

6.6 KiB

Rose Ash Monorepo

Cooperative web platform: federated content, commerce, events, and media processing. Each domain runs as an independent Quart microservice with its own database, communicating via HMAC-signed internal HTTP and ActivityPub events.

Deployment

  • Do NOT push until explicitly told to. Pushes reload code to dev automatically.
  • Cache busting: After editing sx.js, bump the ?v= query string in shared/sx/helpers.py (search for sx.js?v=).

Project Structure

blog/           # Content management, Ghost CMS sync, navigation, WYSIWYG editor
market/         # Product catalog, marketplace pages, web scraping
cart/           # Shopping cart CRUD, checkout (delegates order creation to orders)
events/         # Calendar & event management, ticketing
federation/     # ActivityPub social hub, user profiles
account/        # OAuth2 authorization server, user dashboard, membership
orders/         # Order history, SumUp payment/webhook handling, reconciliation
relations/      # (internal) Cross-domain parent/child relationship tracking
likes/          # (internal) Unified like/favourite tracking across domains
shared/         # Shared library: models, infrastructure, templates, static assets
artdag/         # Art DAG — media processing engine (separate codebase, see below)

Shared Library (shared/)

shared/
  models/          # Canonical SQLAlchemy ORM models for all domains
  db/              # Async session management, per-domain DB support, alembic helpers
  infrastructure/  # App factory, OAuth, ActivityPub, fragments, internal auth, Jinja
  services/        # Domain service implementations + DI registry
  contracts/       # DTOs and service protocols
  browser/         # Middleware, Redis caching, CSRF, error handlers
  events/          # Activity bus + background processor (AP-shaped events)
  config/          # YAML config loading (frozen/readonly)
  static/          # Shared CSS, JS, images
  templates/       # Base HTML layouts, partials (inherited by all apps)

Art DAG (artdag/)

Federated content-addressed DAG execution engine for distributed media processing.

artdag/
  core/      # DAG engine (artdag package) — nodes, effects, analysis, planning
  l1/        # L1 Celery rendering server (FastAPI + Celery + Redis + PostgreSQL)
  l2/        # L2 ActivityPub registry (FastAPI + PostgreSQL)
  common/    # Shared templates, middleware, models (artdag_common package)
  client/    # CLI client
  test/      # Integration & e2e tests

Tech Stack

Web platform: Python 3.11+, Quart (async Flask), SQLAlchemy (asyncpg), Jinja2, HTMX, PostgreSQL, Redis, Docker Swarm, Hypercorn.

Art DAG: FastAPI, Celery, JAX (CPU/GPU), IPFS/Kubo, Pydantic.

Key Commands

Development

./dev.sh                        # Start all services + infra (db, redis, pgbouncer)
./dev.sh blog market            # Start specific services + infra
./dev.sh --build blog           # Rebuild image then start
./dev.sh down                   # Stop everything
./dev.sh logs blog              # Tail service logs

Deployment

./deploy.sh                     # Auto-detect changed apps, build + push + restart
./deploy.sh blog market         # Deploy specific apps
./deploy.sh --all               # Deploy everything

Art DAG

cd artdag/l1 && pytest tests/              # L1 unit tests
cd artdag/core && pytest tests/            # Core unit tests
cd artdag/test && python run.py            # Full integration pipeline
cd artdag/l1 && ruff check .               # Lint
cd artdag/l1 && mypy app/types.py app/routers/recipes.py tests/

Architecture Patterns

Web Platform

  • App factory: create_base_app(name, context_fn, before_request_fns, domain_services_fn) in shared/infrastructure/factory.py — creates Quart app with DB, Redis, CSRF, OAuth, AP, session management
  • Blueprint pattern: Each blueprint exposes register() -> Blueprint, handlers stored in _handlers dict
  • Per-service database: Each service has own PostgreSQL DB via PgBouncer; cross-domain data fetched via HTTP
  • Alembic per-service: Each service declares MODELS and TABLES in alembic/env.py, delegates to shared.db.alembic_env.run_alembic()
  • Inter-service reads: fetch_data(service, query, params) → GET /internal/data/{query} (HMAC-signed, 3s timeout)
  • Inter-service writes: call_action(service, action, payload) → POST /internal/actions/{action} (HMAC-signed, 5s timeout)
  • Inter-service AP inbox: send_internal_activity() → POST /internal/inbox (HMAC-signed, AP-shaped activities for cross-service writes)
  • Fragments: HTML fragments fetched cross-service via fetch_fragments() for composing shared UI (nav, cart mini, auth menu)
  • Soft deletes: Models use deleted_at column pattern
  • Context processors: Each app provides its own context_fn that assembles template context from local DB + cross-service fragments

Auth

  • Account is the OAuth2 authorization server; all other apps are OAuth clients
  • Per-app first-party session cookies (Safari ITP compatible), synchronized via device ID
  • Grant verification: apps check grant validity against account DB (cached in Redis)
  • Silent SSO: prompt=none OAuth flow for automatic cross-app login
  • ActivityPub: RSA signatures, per-app virtual actor projections sharing same keypair

Art DAG

  • 3-Phase Execution: Analyze → Plan → Execute (tasks in artdag/l1/tasks/)
  • Content-Addressed: All data identified by SHA3-256 hashes or IPFS CIDs
  • S-Expression Effects: Composable effect language in artdag/l1/sexp_effects/
  • Storage: Local filesystem, S3, or IPFS backends
  • L1 ↔ L2: scoped JWT tokens; L2: password + OAuth SSO

Domains

Service Public URL Dev Port
blog blog.rose-ash.com 8001
market market.rose-ash.com 8002
cart cart.rose-ash.com 8003
events events.rose-ash.com 8004
federation federation.rose-ash.com 8005
account account.rose-ash.com 8006
relations (internal only) 8008
likes (internal only) 8009
orders orders.rose-ash.com 8010

Key Config Files

  • docker-compose.yml / docker-compose.dev.yml — service definitions, env vars, volumes
  • deploy.sh / dev.sh — deployment and development scripts
  • shared/infrastructure/factory.py — app factory (all services use this)
  • {service}/alembic/env.py — per-service migration config
  • _config/app-config.yaml — runtime YAML config (mounted into containers)

Tools

  • Use Context7 MCP for up-to-date library documentation
  • Playwright MCP is available for browser automation/testing