Skip to main content

Use the command line

Putki Tools answers the same questions as the dashboard, and more, from a terminal. It runs from the same image as the sync job, forge.putki.io/putki/putki-tools:<version> with the version in the bundle's VERSION file:

docker run --rm --network putki-impact \
-e PUTKI_GRAPH_BACKEND=age \
-e PUTKI_GRAPH_JDBC_URL=jdbc:postgresql://graph-db:5432/project_graph \
-e PUTKI_GRAPH_USER=graph -e PUTKI_GRAPH_PASSWORD="$GRAPH_DB_PASSWORD" \
forge.putki.io/putki/putki-tools:2026.12.0 \
project-graph impact --name sales --thing 'Sakila DWH/dwh.dim_customer'
CommandAnswers
project-graph summaryWhat the project holds
project-graph what-uses --thing <key>What reads, writes or calls a table, file, connection or pipeline
project-graph impact --thing <key> [--column <name>]What a change can reach, down the chain, with columns and SQL files
project-graph usage --type <plugin id>Where a transform or action type is used
project-graph brokenCalls to missing files, undefined connections, files that cannot be read
project-graph runs --thing <key>The last runs of what a change reaches, from Hop's execution information in Neo4j

runs needs Hop's execution information in Neo4j (see Execution information): pass its address with --executions-uri. Give --run-folder with the folder the project runs from, so runs of another project with a file of the same name are not mixed in.

Every command prints JSON.

Neo4j instead of AGE​

The graph can also live in Neo4j or Memgraph (PUTKI_GRAPH_BACKEND=neo4j, PUTKI_GRAPH_URI). Use an instance of its own, not the one that holds Hop's execution information: Hop's logging merges its own Pipeline and Workflow nodes by name, and would match the graph's.