{
  "mmsp": "1.0",
  "id": "https://www.crankthecode.com/.well-known/mmsp.json",
  "title": "Crank The Code",
  "feed_url": "https://www.crankthecode.com/.well-known/mmsp.json",
  "description": "Engineering blog by Oliver Ernster. Principal engineer, Python specialist, decision architect. Decision Architecture, software craft and open-source tools.",
  "icon": "https://www.crankthecode.com/static/images/meridian-icon.png",
  "language": "en",
  "authors": [
    {
      "name": "Oliver Ernster",
      "url": "https://www.crankthecode.com/about"
    }
  ],
  "tags": [
    "engineering",
    "python",
    "architecture",
    "software",
    "open-source"
  ],
  "contact": "oernster@codecrafter.uk",
  "poll": {
    "min_interval_seconds": 300,
    "recommended_interval_seconds": 3600
  },
  "items": [
    {
      "id": "https://www.crankthecode.com/posts/battlestation#mmsp-v1",
      "type": "article",
      "title": "The Command Battlestation",
      "url": "https://www.crankthecode.com/posts/battlestation",
      "published": "2026-05-25T12:00:00+00:00",
      "description": "Dev cockpit + 3D printer room.",
      "thumbnail": [
        {
          "url": "https://www.crankthecode.com/static/images/command-battlestation1.8c87b2c5b3.jpg"
        }
      ],
      "tags": [
        "battlestation",
        "setup",
        "3D printing",
        "HOTAS",
        "elite dangerous",
        "peripherals"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA42#mmsp-v1",
      "type": "article",
      "title": "Decision reversibility",
      "url": "https://www.crankthecode.com/posts/OODA42",
      "published": "2026-04-09T01:30:00+00:00",
      "description": "The cost of reversing a decision determines how cautiously it should be made.",
      "tags": [
        "layer:decision-primitives",
        "decision-architecture",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA41#mmsp-v1",
      "type": "article",
      "title": "Decision anchoring",
      "url": "https://www.crankthecode.com/posts/OODA41",
      "published": "2026-04-09T01:00:00+00:00",
      "description": "Early decisions disproportionately influence future choices even when conditions change.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA40#mmsp-v1",
      "type": "article",
      "title": "Decision saturation",
      "url": "https://www.crankthecode.com/posts/OODA40",
      "published": "2026-04-09T00:30:00+00:00",
      "description": "Systems degrade when the rate of incoming decisions exceeds the capacity to resolve them.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-performance"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA39#mmsp-v1",
      "type": "article",
      "title": "Decision aliasing",
      "url": "https://www.crankthecode.com/posts/OODA39",
      "published": "2026-04-09T00:00:00+00:00",
      "description": "Different parts of an organisation often use different names for the same underlying decision.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA38#mmsp-v1",
      "type": "article",
      "title": "Decision gravity",
      "url": "https://www.crankthecode.com/posts/OODA38",
      "published": "2026-04-08T23:30:00+00:00",
      "description": "Decisions naturally move toward centres of authority unless structurally distributed.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA37#mmsp-v1",
      "type": "article",
      "title": "Decision bifurcation",
      "url": "https://www.crankthecode.com/posts/OODA37",
      "published": "2026-04-08T23:00:00+00:00",
      "description": "Some decisions split the system into diverging paths that become increasingly difficult to reconcile.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA36#mmsp-v1",
      "type": "article",
      "title": "Decision entropy",
      "url": "https://www.crankthecode.com/posts/OODA36",
      "published": "2026-04-08T22:30:00+00:00",
      "description": "Decision systems naturally drift toward disorder unless actively structured and maintained.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA35#mmsp-v1",
      "type": "article",
      "title": "Decision compression",
      "url": "https://www.crankthecode.com/posts/OODA35",
      "published": "2026-04-08T22:00:00+00:00",
      "description": "Systems improve when repeated decision patterns are compressed into simpler reusable structures.",
      "tags": [
        "layer:decision-primitives",
        "decision-architecture",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA34#mmsp-v1",
      "type": "article",
      "title": "Decision inertia",
      "url": "https://www.crankthecode.com/posts/OODA34",
      "published": "2026-04-08T21:30:00+00:00",
      "description": "Decisions accumulate resistance to change as systems adapt around them.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA33#mmsp-v1",
      "type": "article",
      "title": "Decision shadow",
      "url": "https://www.crankthecode.com/posts/OODA33",
      "published": "2026-04-08T21:10:00+00:00",
      "description": "Informal decisions often exist in parallel to formal authority structures, shaping outcomes invisibly.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA32#mmsp-v1",
      "type": "article",
      "title": "Decision half life",
      "url": "https://www.crankthecode.com/posts/OODA32",
      "published": "2026-04-08T21:00:00+00:00",
      "description": "The value of a decision decays over time as context and constraints change.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA31#mmsp-v1",
      "type": "article",
      "title": "Authority revocation",
      "url": "https://www.crankthecode.com/posts/OODA31",
      "published": "2026-03-17T04:00:00+00:00",
      "description": "Systems require mechanisms to withdraw decision authority when conditions change.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "governance"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA30#mmsp-v1",
      "type": "article",
      "title": "Decision semaphore",
      "url": "https://www.crankthecode.com/posts/OODA30",
      "published": "2026-03-17T03:10:00+00:00",
      "description": "Concurrency control is required when multiple actors attempt to resolve the same decision simultaneously.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "coordination"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA29#mmsp-v1",
      "type": "article",
      "title": "Decision drift detector",
      "url": "https://www.crankthecode.com/posts/OODA29",
      "published": "2026-03-17T02:35:00+00:00",
      "description": "Systems require mechanisms that detect when authority and responsibility gradually diverge over time.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA28#mmsp-v1",
      "type": "article",
      "title": "Decision sandbox",
      "url": "https://www.crankthecode.com/posts/OODA28",
      "published": "2026-03-17T02:00:00+00:00",
      "description": "Some decisions must be tested safely before they can propagate through the wider organisation.",
      "tags": [
        "layer:decision-primitives",
        "decision-architecture",
        "experimentation"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA27#mmsp-v1",
      "type": "article",
      "title": "Decision quorum",
      "url": "https://www.crankthecode.com/posts/OODA27",
      "published": "2026-03-17T01:30:00+00:00",
      "description": "Some decisions require collective authority where resolution emerges only when a threshold of actors agree.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "governance"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA26#mmsp-v1",
      "type": "article",
      "title": "Boundary guard",
      "url": "https://www.crankthecode.com/posts/OODA26",
      "published": "2026-03-17T01:00:00+00:00",
      "description": "Decision boundaries require explicit guards that prevent decisions from leaking across domains unintentionally.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "organisational-structure"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA25#mmsp-v1",
      "type": "article",
      "title": "Decision cache",
      "url": "https://www.crankthecode.com/posts/OODA25",
      "published": "2026-03-17T00:30:00+00:00",
      "description": "Repeated decisions should be cached so the organisation does not resolve the same question repeatedly.",
      "tags": [
        "layer:decision-primitives",
        "decision-architecture",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA24#mmsp-v1",
      "type": "article",
      "title": "Authority lease",
      "url": "https://www.crankthecode.com/posts/OODA24",
      "published": "2026-03-17T00:00:00+00:00",
      "description": "Temporary authority can be leased to actors closest to the work without permanently restructuring governance.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "leadership"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA23#mmsp-v1",
      "type": "article",
      "title": "Decision queue",
      "url": "https://www.crankthecode.com/posts/OODA23",
      "published": "2026-03-16T23:30:00+00:00",
      "description": "Decision latency accumulates when unresolved decisions form invisible queues inside authority boundaries.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA22#mmsp-v1",
      "type": "article",
      "title": "Decision router",
      "url": "https://www.crankthecode.com/posts/OODA22",
      "published": "2026-03-16T23:00:00+00:00",
      "description": "Decisions must be routed to the correct authority domain before they can terminate.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "organisational-design",
        "system-dynamics"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA21#mmsp-v1",
      "type": "article",
      "title": "Decision observer",
      "url": "https://www.crankthecode.com/posts/OODA21",
      "published": "2026-03-16T22:30:00+00:00",
      "description": "Observability of decision flow allows organisations to detect systemic problems before delivery fails.",
      "tags": [
        "layer:pattern-catalogue",
        "decision-architecture",
        "system-dynamics",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA20#mmsp-v1",
      "type": "article",
      "title": "Decision circuit breaker",
      "url": "https://www.crankthecode.com/posts/OODA20",
      "published": "2026-03-16T22:00:00+00:00",
      "description": "Organisations require a mechanism that halts cascading decision failure during crisis.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "leadership",
        "organisational-resilience"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA19#mmsp-v1",
      "type": "article",
      "title": "Decision aggregator",
      "url": "https://www.crankthecode.com/posts/OODA19",
      "published": "2026-03-16T21:30:00+00:00",
      "description": "Some organisational decisions only become meaningful when many smaller decisions are combined.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-behaviour"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA18#mmsp-v1",
      "type": "article",
      "title": "Authority proxy",
      "url": "https://www.crankthecode.com/posts/OODA18",
      "published": "2026-03-16T21:00:00+00:00",
      "description": "Authority can be temporarily delegated through proxy roles when direct ownership is impractical.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "leadership",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA17#mmsp-v1",
      "type": "article",
      "title": "Decision facade",
      "url": "https://www.crankthecode.com/posts/OODA17",
      "published": "2026-03-16T20:40:00+00:00",
      "description": "Complex organisational decision structures can be simplified through a single visible interface.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "organisational-design",
        "system-dynamics"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA16#mmsp-v1",
      "type": "article",
      "title": "Escalation chain",
      "url": "https://www.crankthecode.com/posts/OODA16",
      "published": "2026-03-16T20:20:00+00:00",
      "description": "Escalation paths behave like linked objects carrying unresolved decisions through authority levels.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "organisational-behaviour",
        "leadership"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA15#mmsp-v1",
      "type": "article",
      "title": "Decision factory",
      "url": "https://www.crankthecode.com/posts/OODA15",
      "published": "2026-03-16T20:00:00+00:00",
      "description": "Organisations need a consistent mechanism for creating decision objects with the right authority and scope.",
      "tags": [
        "layer:decision-primitives",
        "decision-architecture",
        "organisational-design",
        "leadership"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA14#mmsp-v1",
      "type": "article",
      "title": "Structural feedback loops in decision systems",
      "url": "https://www.crankthecode.com/posts/OODA14",
      "published": "2026-03-16T19:40:00+00:00",
      "description": "Organisations learn effectively when feedback travels through structural pathways to decision authority.",
      "tags": [
        "layer:pattern-catalogue",
        "decision-architecture",
        "governance",
        "organisational-learning",
        "system-dynamics"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA13#mmsp-v1",
      "type": "article",
      "title": "Optionality as a structural resource",
      "url": "https://www.crankthecode.com/posts/OODA13",
      "published": "2026-03-16T19:00:00+00:00",
      "description": "Optionality strengthens organisations when it is deliberately constrained rather than preserved indefinitely.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "strategy",
        "organisational-design",
        "leadership"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA12#mmsp-v1",
      "type": "article",
      "title": "Decision load as a system signal",
      "url": "https://www.crankthecode.com/posts/OODA12",
      "published": "2026-03-16T18:30:00+00:00",
      "description": "Rising decision load indicates structural congestion rather than individual inefficiency.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "organisational-performance",
        "leadership",
        "system-dynamics"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA11#mmsp-v1",
      "type": "article",
      "title": "Responsibility without authority as structural debt",
      "url": "https://www.crankthecode.com/posts/OODA11",
      "published": "2026-03-16T17:30:00+00:00",
      "description": "Assigning responsibility without decision authority creates systemic tension and delivery instability.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "organisational-behaviour",
        "leadership",
        "governance"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA10#mmsp-v1",
      "type": "article",
      "title": "Decision adapter",
      "url": "https://www.crankthecode.com/posts/OODA10",
      "published": "2026-03-16T17:15:00+00:00",
      "description": "Organisations often require translation layers when decisions move between incompatible domains.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA9#mmsp-v1",
      "type": "article",
      "title": "Organisational decision interfaces",
      "url": "https://www.crankthecode.com/posts/OODA9",
      "published": "2026-03-16T17:00:00+00:00",
      "description": "Coordination improves when teams interact through defined decision interfaces rather than informal negotiation.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "organisational-structure",
        "system-design",
        "coordination"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA8#mmsp-v1",
      "type": "article",
      "title": "Escalation surfaces in organisational systems",
      "url": "https://www.crankthecode.com/posts/OODA8",
      "published": "2026-03-16T16:30:00+00:00",
      "description": "Escalation becomes efficient when it is structurally designed rather than socially negotiated.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "governance",
        "organisational-behaviour",
        "system-dynamics"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA7#mmsp-v1",
      "type": "article",
      "title": "Authority follows the shape of the decision",
      "url": "https://www.crankthecode.com/posts/OODA7",
      "published": "2026-03-16T16:00:00+00:00",
      "description": "Authority functions best when it is assigned according to decision type rather than organisational hierarchy.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "organisational-design",
        "leadership",
        "governance"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA6#mmsp-v1",
      "type": "article",
      "title": "Decision termination as a structural property",
      "url": "https://www.crankthecode.com/posts/OODA6",
      "published": "2026-03-16T15:30:00+00:00",
      "description": "Decisions must have a defined termination point or they circulate endlessly through the organisation.",
      "tags": [
        "layer:decision-primitives",
        "decision-architecture",
        "organisational-behaviour",
        "system-dynamics",
        "leadership"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA5#mmsp-v1",
      "type": "article",
      "title": "Decision architecture patterns in organisational systems",
      "url": "https://www.crankthecode.com/posts/OODA5",
      "published": "2026-03-16T10:30:00+00:00",
      "description": "Repeating failure modes appear when decision objects interact through poorly designed structures.",
      "tags": [
        "layer:pattern-catalogue",
        "decision-architecture",
        "organisational-behaviour",
        "system-dynamics",
        "leadership"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA4#mmsp-v1",
      "type": "article",
      "title": "Authority behaves like a type system",
      "url": "https://www.crankthecode.com/posts/OODA4",
      "published": "2026-03-16T09:00:00+00:00",
      "description": "Authority boundaries function like type systems preventing invalid decisions from entering the system.",
      "tags": [
        "layer:authority-models",
        "decision-architecture",
        "governance",
        "system-dynamics",
        "organisational-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA3#mmsp-v1",
      "type": "article",
      "title": "Decision surfaces and organisational interfaces",
      "url": "https://www.crankthecode.com/posts/OODA3",
      "published": "2026-03-16T08:00:00+00:00",
      "description": "Decision surfaces function as the interfaces where authority and accountability meet.",
      "tags": [
        "layer:decision-interfaces",
        "decision-architecture",
        "authority",
        "systems-design",
        "organisational-structure"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA2#mmsp-v1",
      "type": "article",
      "title": "The core primitives of decision architecture",
      "url": "https://www.crankthecode.com/posts/OODA2",
      "published": "2026-03-16T06:10:00+00:00",
      "description": "Organisations repeatedly generate the same decision objects regardless of industry or structure.",
      "tags": [
        "layer:system-dynamics",
        "decision-architecture",
        "systems",
        "organisational-design",
        "governance"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/OODA1#mmsp-v1",
      "type": "article",
      "title": "Decision objects and the shape of organisational systems",
      "url": "https://www.crankthecode.com/posts/OODA1",
      "published": "2026-03-16T04:50:00+00:00",
      "description": "Organisations behave like systems of interacting decision objects rather than hierarchies of job titles.",
      "tags": [
        "layer:decision-primitives",
        "decision-architecture",
        "organisational-design",
        "systems-thinking",
        "decision-systems"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog22#mmsp-v1",
      "type": "article",
      "title": "NarrateX - When software is engineered rather than assembled",
      "url": "https://www.crankthecode.com/posts/blog22",
      "published": "2026-03-15T02:45:00+00:00",
      "description": "A local audiobook reader that quietly replaces an entire commercial category",
      "tags": [
        "python",
        "desktop-app",
        "tts",
        "kokoro",
        "architecture",
        "software-engineering",
        "open-source"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/governance1#mmsp-v1",
      "type": "article",
      "title": "Resilient Democracy",
      "url": "https://www.crankthecode.com/posts/governance1",
      "published": "2026-02-25T21:30:00+00:00",
      "description": "A structural alternative to two-party democracy designed to preserve legitimacy while improving competence.",
      "tags": [
        "institutional-design",
        "resilience",
        "decision-architecture",
        "democracy",
        "democratic-reform",
        "institutional-reform",
        "referendum-design",
        "two-party-system"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog19#mmsp-v1",
      "type": "article",
      "title": "When the interface becomes the bottleneck",
      "url": "https://www.crankthecode.com/posts/blog19",
      "published": "2026-02-15T15:00:00+00:00",
      "description": "The simulator was not the constraint. The surface was.",
      "tags": [
        "architecture",
        "modelling",
        "systems",
        "product-design"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/governance2#mmsp-v1",
      "type": "article",
      "title": "When consensus becomes the goal",
      "url": "https://www.crankthecode.com/posts/governance2",
      "published": "2026-02-11T20:00:00+00:00",
      "description": "Consensus often appears when no one is allowed to decide.",
      "tags": [
        "decision-making",
        "authority",
        "organisations",
        "systems"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog17#mmsp-v1",
      "type": "article",
      "title": "Automating tagging in crankthecode for menu organisation",
      "url": "https://www.crankthecode.com/posts/blog17",
      "published": "2026-02-07T14:30:00+00:00",
      "description": "Effective management of the crankthecode website.",
      "tags": [
        "tag",
        "fastapi",
        "tagging",
        "organisation"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog13#mmsp-v1",
      "type": "article",
      "title": "The Illusion of Engineering",
      "url": "https://www.crankthecode.com/posts/blog13",
      "published": "2026-01-28T18:00:00+00:00",
      "description": "AI can generate code but it cannot replace software engineering.",
      "tags": [
        "ai",
        "development",
        "engineering",
        "quality"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/voron-trident-hypernova-upgrade#mmsp-v1",
      "type": "article",
      "title": "HyperNova, Rails and Rethinking the Voron",
      "url": "https://www.crankthecode.com/posts/voron-trident-hypernova-upgrade",
      "published": "2026-01-27T00:45:00+00:00",
      "description": "Upgrading the Voron Trident with a HyperNova toolhead new rails and a precision Cartographer mod.",
      "tags": [
        "3D printing",
        "voron",
        "hypernova",
        "engineering",
        "cartographer"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog6#mmsp-v1",
      "type": "article",
      "title": "Sitemaps, Side-by-Sides and Satisfying Polish",
      "url": "https://www.crankthecode.com/posts/blog6",
      "published": "2026-01-24T15:20:00+00:00",
      "description": "Post-launch refinements including sitemap setup, layout alignment and enhanced polish across tooling and templates.",
      "tags": [
        "update",
        "seo",
        "layout",
        "refactor",
        "tooling"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/the-led-problem-the-virpil-community-had#mmsp-v1",
      "type": "article",
      "title": "The LED Problem the Virpil Community Had",
      "url": "https://www.crankthecode.com/posts/the-led-problem-the-virpil-community-had",
      "published": "2026-01-24T11:30:00+00:00",
      "tags": [
        "peripherals"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/niche-tools#mmsp-v1",
      "type": "article",
      "title": "Why I Keep Building Niche Tools",
      "url": "https://www.crankthecode.com/posts/niche-tools",
      "published": "2026-01-24T11:30:00+00:00",
      "description": "Because general-purpose tools are rarely personal.",
      "tags": [
        "workflow",
        "philosophy",
        "solo-dev"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/ai-standard#mmsp-v1",
      "type": "article",
      "title": "On Working with Machines",
      "url": "https://www.crankthecode.com/posts/ai-standard",
      "published": "2026-01-24T11:30:00+00:00",
      "description": "Working with machines means accepting their limits.",
      "tags": [
        "ai",
        "philosophy",
        "human-computer interaction",
        "autonomy"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/hardware-guides-are-accidental-bios#mmsp-v1",
      "type": "article",
      "title": "Hardware Guides Are Accidental Biographies",
      "url": "https://www.crankthecode.com/posts/hardware-guides-are-accidental-bios",
      "published": "2026-01-24T11:30:00+00:00",
      "description": "Every printer guide is a life story in disguise.",
      "tags": [
        "3D printing",
        "documentation",
        "klipper",
        "Qidi",
        "tronxy"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/simple-hacking#mmsp-v1",
      "type": "article",
      "title": "Simple Hacking",
      "url": "https://www.crankthecode.com/posts/simple-hacking",
      "published": "2026-01-24T11:30:00+00:00",
      "description": "Tinkering without breaking things. Mostly.",
      "tags": [
        "hacking",
        "philosophy",
        "reverse-engineering",
        "systems"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/tiny-tools#mmsp-v1",
      "type": "article",
      "title": "Tiny Tools I Refuse to Live Without",
      "url": "https://www.crankthecode.com/posts/tiny-tools",
      "published": "2026-01-24T11:30:00+00:00",
      "description": "Tiny tools with massive impact.",
      "tags": [
        "utilities",
        "workflow",
        "quality-of-life"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/bots#mmsp-v1",
      "type": "article",
      "title": "Bots Are Interfaces",
      "url": "https://www.crankthecode.com/posts/bots",
      "published": "2026-01-24T11:30:00+00:00",
      "description": "Bots are more than code ~ they’re your interface with chaos.",
      "tags": [
        "bots",
        "discord",
        "chatbots",
        "interface",
        "sarcasm",
        "3D printers",
        "snark3Dprinter-discord-bot"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog5#mmsp-v1",
      "type": "article",
      "title": "UI Polish, CTAs and the Slow March to Done",
      "url": "https://www.crankthecode.com/posts/blog5",
      "published": "2026-01-24T06:15:00+00:00",
      "description": "A tour through UI tweaks, CTA wrangling and why stopping matters more than starting.",
      "tags": [
        "update",
        "ui",
        "ux",
        "accessibility",
        "css",
        "dark-mode"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog4#mmsp-v1",
      "type": "article",
      "title": "WP Bots and RSS Weirdness Blog Update",
      "url": "https://www.crankthecode.com/posts/blog4",
      "published": "2026-01-21T02:20:00+00:00",
      "description": "Fixed RSS encoding and ignored WordPress sniffers. As one does.",
      "tags": [
        "update",
        "rss",
        "feed",
        "botnet",
        "html",
        "utf8",
        "encoding"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog3#mmsp-v1",
      "type": "article",
      "title": "Command Centre Update",
      "url": "https://www.crankthecode.com/posts/blog3",
      "published": "2026-01-21T01:45:00+00:00",
      "description": "Added hero and battlestation sections.",
      "tags": [
        "update",
        "python",
        "fastapi",
        "changelog",
        "html",
        "css",
        "javascript"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog2#mmsp-v1",
      "type": "article",
      "title": "Tables, Taglines and Terminal Fakery",
      "url": "https://www.crankthecode.com/posts/blog2",
      "published": "2026-01-20T11:50:00+00:00",
      "description": "Search autocomplete now works, the Help button is unhelpful and every post has just enough recruiter bait.",
      "tags": [
        "update",
        "python",
        "fastapi",
        "changelog",
        "html",
        "css",
        "javascript"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/blog1#mmsp-v1",
      "type": "article",
      "title": "Site SEO & Search Updates",
      "url": "https://www.crankthecode.com/posts/blog1",
      "published": "2026-01-18T10:55:00+00:00",
      "description": "Blog update with SEO",
      "tags": [
        "python",
        "fastapi",
        "seo",
        "crankthecode",
        "html"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/why-crank#mmsp-v1",
      "type": "article",
      "title": "Why Crank?",
      "url": "https://www.crankthecode.com/posts/why-crank",
      "published": "2026-01-18T10:40:00+00:00",
      "description": "Motivation",
      "thumbnail": [
        {
          "url": "https://www.crankthecode.com/static/images/me-cyborg.626f2b893b.png"
        }
      ],
      "tags": [
        "overengineering",
        "why"
      ]
    },
    {
      "id": "https://www.crankthecode.com/posts/hello-crank#mmsp-v1",
      "type": "article",
      "title": "Hello Crank",
      "url": "https://www.crankthecode.com/posts/hello-crank",
      "published": "2026-01-18T10:11:00+00:00",
      "description": "A quick welcome to Crank The Code.",
      "thumbnail": [
        {
          "url": "https://www.crankthecode.com/static/images/me.147c1b2133.jpg"
        }
      ],
      "tags": [
        "launch"
      ]
    }
  ]
}