PhilippTheServer

architecture

Decomposition, boundaries and deciding what should not be built.

  1. Tracking Meals and Automating Shopping With an MCP Server

    An MCP server for meal tracking and grocery shopping automation: planned meals minus live stock, and why the v2 rebuild derives stock from an event journal.

  2. Automating Web Shop Order Processing Before the Catalogue

    Web shop order processing automated first: Stripe webhook payment confirmation, stock reservations, outbox-driven DHL labels, two manual steps.

  3. OpenTaberna: Headless, Open-Source E-Commerce You Self-Host

    OpenTaberna is headless, open-source e-commerce: an Apache-2.0 shop API on FastAPI and PostgreSQL that you self-host with Docker Compose.

  4. A Daily Digest of What Actually Got Merged, Built from MQTT and a Local LLM

    paho-mqtt subscriber to SQLite plus a local LLM: a daily digest that summarises merged pull requests per repository from diff stats, no cloud API.

  5. The Whole Estate in One Article: How Every Layer Fits Together

    Self-hosted platform build order: why mesh, cluster, Ceph storage, identity and observability must precede model serving, shown with Compose depends_on.

  6. Documentation as a Repository: Publishing a Wiki.js Site from Reviewed Markdown

    Wiki.js Git storage for docs as code: publish reviewed Markdown and fail a pull request when src/ changes without docs/, checked with git diff.

  7. When Microservice Decomposition Is the Wrong Default

    import-linter forbidden contract as a module boundary: a FastAPI modular monolith instead of early microservices, and when a network split pays off.

  8. Self-Hosted Identity with Keycloak: Central Offboarding and Forward Auth

    Keycloak "invalid_grant" "Account disabled": one admin API call disables a user for every OIDC client, plus oauth2-proxy forward auth for apps without login.

  9. An Entity Graph as the Data Model for a Heterogeneous Estate

    Go entity graph data model: one Entity struct with Kind and Attrs, typed contains, dependsOn and runsOn edges, health rollup and cycle detection.

  10. The Transactional Outbox: Never Losing a Job You Already Committed

    Transactional outbox in Postgres: commit-then-enqueue loses jobs on a crash. A SKIP LOCKED relay to Redis Streams and an idempotent consumer.

  11. Layering an Angular Application: core, shared, features and the Rule That Holds

    eslint-plugin-boundaries element-types: enforcing one dependency direction between Angular core, shared and features folders, with a failing lint example.

  12. Embedding a Built Frontend Into a Go Binary with go:embed

    //go:embed dist with http.FileServer returns 404 on SPA client routes after a refresh: an index.html fallback, serving the API from the same Go binary.

  13. Serving Several Local Models on One GPU with On-Demand Loading

    llama-swap config.yaml with cmd, ttl and healthCheckTimeout: loading llama-server models on demand and unloading idle ones on a single GPU.

  14. One Dashboard on Five Unrelated Backends: Normalising at the Boundary

    asyncio.gather with return_exceptions=True in a FastAPI BFF: map two upstream APIs onto one schema and return partial data with health when one is down.

  15. Modelling an Order Lifecycle as an Explicit State Machine

    Python order status as a state machine: a transition table and one transition_to method that raises InvalidTransition on moves like shipping a cancelled order.

  16. UUID Case Normalization as a Recurring Cross-Service Bug

    Uppercase vs lowercase UUID keys cause silent cache and database lookup misses between services. Normalise once at the boundary with str(uuid.UUID(value)).

  17. Docker Compose or Kubernetes: What the Control Loop Actually Buys You

    Docker Compose restart: always vs a Kubernetes Deployment: what happens when the host dies, and what the control loop costs in debugging.

  18. A Single-Writer Rule for Configuration Held in Redis

    SET NX PX lease plus a Lua script that checks the fencing token, bumps a version and publishes, so exactly one process writes a Redis config key.

  19. Chaining Single-Purpose Redis Consumers into a Processing Pipeline

    XREADGROUP, XACK and XAUTOCLAIM: splitting one Python consumer into single-purpose Redis Streams stages with at-least-once delivery and crash recovery.

  20. Tracking Moving Objects with Redis Sorted Sets and an Atomic Lua Tick

    ZINCRBY updates one member only: a Lua script via redis-cli --eval advances every sorted set score atomically and returns members past a threshold.

  21. A Python CLI That Scaffolds a Project Structure You Actually Want

    Python scaffolding CLI with only argparse and string.Template: generates src layout, pyproject.toml, Dockerfile and .gitignore, tested with tomllib.

  22. A Feature-Module Layout for a FastAPI Application That Keeps Growing

    FastAPI APIRouter per feature directory with its own router.py, schemas.py and service.py, replacing a shared routers.py, schemas.py and crud.py.

All topics · All writing