# Config versions

Shipshape has two configuration formats. The same binary runs both.

1.x is the recommended format

The 1.x pipeline (collect / analyse / output) is used in production and is the recommended format for new configurations. The 0.x checks: format is fully supported and continues to run without changes.

Not sure if 1.x covers everything you need? Check the gaps matrix to see how each 0.x check is reproduced in 1.x, and the roadmap to see what's coming.

# Which format should I use?

  • Starting a new configuration — use 1.x.
  • Running an existing 0.x config — it still runs as-is. Migrate to 1.x when convenient; there is no forced migration.
  • Relying on a check that isn't ported yet — check the gaps matrix. If the 1.x equivalent isn't there yet, keep using the 0.x check until it lands.

# How the binary picks a format

When Shipshape reads a config file it tries to parse it as a 1.x config first. If any of the top-level 1.x keys (connections, collect, analyse, output) are present, the file is treated as 1.x and the pipeline runner is used. If none of those keys are found, the file is treated as 0.x and the checks runner is used.

The distinguishing key is the top-level block name:

# 0.x — identified by the top-level "checks:" key
checks:
  file:
    - name: Illegal files
      path: web
      disallowed-pattern: '^(adminer|phpmyadmin|bigdump)?\.php$'
# 1.x — identified by any of: connections, collect, analyse, output
collect:
  disallowed-php-scripts:
    file:lookup:
      path: web
      pattern: '^(adminer|phpmyadmin|bigdump)?\.php$'

analyse:
  disallowed-php-scripts-found:
    not:empty:
      description: 'Disallowed php scripts found'
      input: disallowed-php-scripts
      severity: high

If a file contains both a checks: key and a 1.x key, the 1.x runner takes precedence.

# Format overview

0.x 1.x
Top-level key checks: collect: / analyse: / output:
Config struct Config ConfigV2
Runner RunConfig RunV2
Model One check per concern — collection, evaluation, and optional remediation bundled together Composable pipeline — collect data with one plugin, analyse it with another
Status Fully supported Recommended

# What's the difference?

A 0.x check is a single, opinionated unit: it knows how to collect the data it needs, evaluate it, and (for some checks) fix problems it finds. A 1.x config separates those steps — a collect plugin gathers raw data, an analyse plugin evaluates it. This makes the pieces reusable and composable, at the cost of needing more explicit wiring.

The gaps matrix shows which 0.x checks have a full 1.x equivalent today, and the 0.x config guide documents the checks: format in full.

# The 1.x way: compose, don't port

0.x gave you one dedicated check type per task. 1.x takes a different approach: a small set of general-purpose collect and analyse plugins that you wire together to achieve the same outcome. You won't find a one-to-one replacement plugin for each 0.x check — instead you compose the same handful of building blocks (for example command + allowed:list, or file:read + yaml:key + equals) in different ways. The building blocks are reusable across many checks, so learning a few covers a lot of ground.

The gaps matrix is the recipe catalogue: for each 0.x check it shows the plugin chain that reproduces it in 1.x.