{"id":19270105,"url":"https://github.com/hyperledger-labs/fablo","last_synced_at":"2026-01-02T11:57:06.620Z","repository":{"id":38833284,"uuid":"224837230","full_name":"hyperledger-labs/fablo","owner":"hyperledger-labs","description":"Fablo is a simple tool to generate the Hyperledger Fabric blockchain network and run it on Docker. It supports RAFT and solo consensus protocols, multiple organizations and channels, chaincode installation and upgrade.","archived":false,"fork":false,"pushed_at":"2025-05-06T11:27:50.000Z","size":7698,"stargazers_count":211,"open_issues_count":37,"forks_count":85,"subscribers_count":20,"default_branch":"main","last_synced_at":"2025-05-06T12:48:59.250Z","etag":null,"topics":["blockchain","chaincodes","generator","hyperledger","hyperledger-fabric","hyperledger-fabric-network","network-topology"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hyperledger-labs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-11-29T11:01:59.000Z","updated_at":"2025-05-05T09:16:00.000Z","dependencies_parsed_at":"2024-07-23T15:16:55.235Z","dependency_job_id":"859c27e0-5702-4266-b0bc-b306cb0088b3","html_url":"https://github.com/hyperledger-labs/fablo","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperledger-labs%2Ffablo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperledger-labs%2Ffablo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperledger-labs%2Ffablo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperledger-labs%2Ffablo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hyperledger-labs","download_url":"https://codeload.github.com/hyperledger-labs/fablo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254544146,"owners_count":22088807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","chaincodes","generator","hyperledger","hyperledger-fabric","hyperledger-fabric-network","network-topology"],"created_at":"2024-11-09T20:23:14.243Z","updated_at":"2026-01-02T11:57:06.614Z","avatar_url":"https://github.com/hyperledger-labs.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Github Actions](https://github.com/hyperledger-labs/fablo/actions/workflows/test.yml/badge.svg?branch=main)\n\n\u003ch1\u003e\u003cimg src=\"./logo.svg\" alt=\"Fablo\"/\u003e\u003c/h1\u003e\n\nFablo allows you to start Hyperledger Fabric network from a single config file. It's best for local development, CI processes and experimenting with various network configurations.\n\nFablo supports:\n\n* Environment: Docker\n* RAFT, solo and BFT consensus protocols\n* Multiple organizations and channels\n* Chaincode installation and upgrade (Node, Go, Java, CCaaS)\n* REST API client for CA and chaincodes ([Fablo REST](https://github.com/fablo-io/fablo-rest))\n* [Blockchain Explorer](https://github.com/hyperledger/blockchain-explorer) which can be enabled for each organization\n\nVisit [SUPPORTED_FEATURES.md](SUPPORTED_FEATURES.md) to see the full list of features supported by Fablo.\n\n## See it in action\n\n[\u0026gt;\u0026gt;\u0026gt; Watch the demo \u0026lt;\u0026lt;\u0026lt;](https://www.youtube.com/watch?v=5yn3_g6Cybw)\n\n## Installation\n\nFablo is distributed as a single shell script that uses a Docker image to generate the network configuration.\nYou can keep the script in the root directory of your project or install it globally on your system.\n\nTo get a copy of Fablo for a single project, run this command in your project root:\n\n```bash\ncurl -Lf https://github.com/hyperledger-labs/fablo/releases/download/2.4.3/fablo.sh -o ./fablo \u0026\u0026 chmod +x ./fablo\n```\n\nTo install it globally, run:\n\n```bash\nsudo curl -Lf https://github.com/hyperledger-labs/fablo/releases/download/2.4.3/fablo.sh -o /usr/local/bin/fablo \u0026\u0026 sudo chmod +x /usr/local/bin/fablo\n```\n\n## Getting started\n\nTo create a local Hyperledger Fabric network with Node.js chaincode and REST API client, install Fablo and run:\n\n```bash\nfablo init node rest\nfablo up\n```\n\nNote: For local setup use `./fablo` instead of `fablo`.\n\nAfter a few minutes, the entire network will be set up and running.\nYou can check the running nodes using `docker ps` or `docker stats`, and query the network via command line (`fablo chaincode invoke|query`) or REST API client (via [Fablo REST](https://github.com/fablo-io/fablo-rest)).\n\n## Basic usage\n\n```bash\nfablo up /path/to/fablo-config.json\n```\n\nThe `up` command creates the initial configuration and starts the Hyperledger Fabric network on Docker.\nThe network configuration is saved in `$(pwd)/fablo-target`.\nYou can then manage the network with other commands such as `stop`, `start`, `down`, and `prune`.\n\nThe Fablo configuration file describes the network topology: root organization, other organizations, channels, and chaincodes.\nSee the [samples](https://github.com/hyperledger-labs/fablo/blob/main/samples/) or [Fablo config](https://github.com/hyperledger-labs/fablo#fablo-config) section for examples.\n\nThere are two basic use cases.\nYou may use Fablo to start and manage the network for development purposes, test different network topologies, run it in CI environment etc.\nIn this case you should keep `fablo-target` directory intact and out of the version control.\nFablo will manage it locally.\n\nOn the other hand you can use Fablo to generate initial network configuration, keep it in version control and tweak for specific requirements.\nIn this case, however, you should use generated `fablo-docker.sh` instead of `fablo` script.\n\n## Managing the network\n\n### init\n\n```bash\nfablo init [node] [rest] [dev] [gateway]\n```\n\nCreates a simple network configuration file (`fablo-config.json`) in the current directory.\nThis is a good starting point for your Fablo journey or to set up a quick prototype. \n\nThe generated network configuration includes an orderer organization with two BFT orderer nodes and a peer organization with two peers.\nIt uses Fabric version `3.1.0`. \n\nThe `fablo init` command accepts several optional parameters (order doesn't matter):\n* `node` - generates a sample Node.js chaincode\n* `rest` - enables a simple REST API with [Fablo REST](https://github.com/fablo-io/fablo-rest) as a standalone Docker container\n* `dev` - enables chaincode hot reload mode\n* `gateway` - generates a sample Node.js server that connects to the gateway\n\nSample command:\n\n```bash\nfablo init node dev\n```\n\n### generate\n\n```bash\nfablo generate [/path/to/fablo-config.json|yaml [/path/to/fablo/target]]\n```\n\nGenerates network configuration files in the specified directory.\nDefault config file path is `$(pwd)/fablo-config.json` or `$(pwd)/fablo-config.yaml`, default directory is `$(pwd)/fablo-target`.\nIf you specify a different directory, you lose Fablo support for other commands.\n\nIf you want to use Fablo only to generate the Hyperledger Fabric network configuration, you can provide a target directory parameter or copy the generated `fablo-target` directory content to your desired directory and add it to version control.\nNote that generated files may contain variables with paths on your disk and generated crypto material for Hyperledger Fabric.\nReview the files before committing to version control.\n\n### up\n\n```bash\nfablo up [/path/to/fablo-config.json|yaml]\n```\n\nStarts the Hyperledger Fabric network for the given Fablo configuration file, creates channels, and installs and instantiates chaincodes.\nIf no configuration exists, it will call the `generate` command for the given config file.\n\n### down, start, stop\n\n```bash\nfablo [down | start | stop]\n```\n\nStops, starts, or stops the Hyperledger Fabric network for the configuration in the current directory.\nThis is similar to the down, start, and stop commands for Docker Compose.\n\n### prune\n\n```bash\nfablo prune\n```\n\nStops the network and removes the `fablo-target` directory.\n\n### reset and recreate\n\n```bash\nfablo reset\nfablo recreate [/path/to/fablo-config.json|yaml]\n```\n\n* `reset` - combines down and up steps. Network state is lost, but the configuration is kept intact. Useful when you want a fresh network instance without any state.\n* `recreate` - prunes the network, generates new config files, and starts the network. Useful when you've edited the `fablo-config` file and want to start a newer network version in one command.    \n\n### validate\n\n```bash\nfablo validate [/path/to/fablo-config.json|yaml]\n```\n\nValidates the network configuration. This command will validate your network config and suggest necessary changes or additional tweaks.\nNote that this step is also executed automatically before each `generate` to ensure that at least critical errors are fixed. \n\n### export-network-topology\n\n```bash\nfablo export-network-topology [/path/to/fablo-config.json] [outputFile.mmd]\n\n```\n- `outputFile.mmd`: (optional) Path to the output Mermaid file. Defaults to `network-topology.mmd`.\n\nSample command:\n\n```bash\nfablo export-network-topology fablo-config.json network-topology.mmd\n```\n\nYou can visualize the output using any Mermaid-compatible tool or online editor.\n\n### extend-config \n\n```bash\nfablo extend-config [/path/to/fablo-config.json|yaml]\n```\n\nGenerates an extended version of the Fablo config by filling in default and computed values based on the provided configuration file and making some config parts more verbos. \n\n### snapshot and restore\n\nFablo supports saving state snapshots (backups) of the network and restoring them.\nIt saves all network artifacts, certificates, and data from CA, orderer, and peer nodes.\nNote that the snapshot does not contain the Fablo config file and chaincode source code, as both can be located outside the Fablo working directory.\n\nSnapshotting is useful if you want to preserve the current state of a network for future use (testing, sharing the network state, courses, etc.).\n\n```bash\nfablo snapshot \u003ctarget-snapshot-path\u003e\n```\n\nTo restore a snapshot into the current directory, run:\n\n```bash\nfablo restore \u003csource-snapshot-path\u003e\n```\n\nExample:\n\n1. Assume you have a working network with some state.\n2. Run `./fablo snapshot /tmp/my-snapshot`. This creates a file `/tmp/my-snapshot.fablo.tar.gz` with the network state. You don't need to stop the network before making a snapshot.\n3. Run `./fablo prune` to destroy the current network. If the network is present, Fablo won't be able to restore the new one from backup.\n4. Run `./fablo restore /tmp/my-snapshot` to restore the network.\n5. Run `./fablo start` to start the restored network.\n6. When running external chaincodes (CCAAS), run `./fablo chaincodes install` to start the CCAAS container\n\nTypically, a snapshot of a network with little data will be less than 1 MB, making it easy to share.\n\n### fabric-docker.sh\n\nThe `fabric-docker.sh` script is generated alongside the Docker network configuration.\nIt doesn't support the `generate` command, but other commands work the same way as in `fablo`.\nEssentially, `fablo` forwards some commands to this script.\n\nIf you want to use Fablo for network configuration setup only, the `fabric-docker.sh` file allows you to manage the network.\n\n## Managing chaincodes\n\n### chaincode(s) install\n\n```bash\nfablo chaincodes install\n```\nInstalls all chaincodes. This might be useful if Fablo fails to install them automatically.\n\nTo install a single chaincode defined in the Fablo config file, run:\n\n```bash\nfablo chaincode install \u003cchaincode-name\u003e \u003cversion\u003e\n```\n\n### chaincode upgrade\n\n```bash\nfablo chaincode upgrade \u003cchaincode-name\u003e \u003cversion\u003e\n```\n\nUpgrades the chaincode with the given name on all relevant peers.\nThe chaincode directory is specified in the Fablo config file.\n\n### chaincode invoke\nInvokes a chaincode with the specified parameters.\n\n```\nfablo chaincode invoke \u003cpeers-domains-comma-separated\u003e  \u003cchannel-name\u003e  \u003cchaincode-name\u003e \u003ccommand\u003e [transient] \n```\nSample command:\n\n```\nfablo chaincode invoke \"peer0.org1.example.com\" \"my-channel1\" \"chaincode1\" '{\"Args\":[\"KVContract:put\", \"name\", \"Willy Wonka\"]}'\n```\n\n### chaincodes list\nLists the instantiated or installed chaincodes in the specified channel or peer. \n\n```\nfablo chaincodes list \u003cpeer\u003e \u003cchannel\u003e\n```\n\n### Achieving chaincode hot reload\n\nHot reload of chaincode code is a way to speed up development.\nIn this case, chaincodes don't need to be upgraded each time, but they are run locally.\n\nFablo supports two options for achieving hot code reload in chaincodes:\n1. Using Hyperledger Fabric [peer dev mode](https://hyperledger-fabric.readthedocs.io/en/release-2.4/peer-chaincode-devmode.html)\n2. Using CCaaS chaincode type with the chaincode process running inside the container\n\nThe peer dev mode approach is simpler but has some trade-offs.\n\n| Peer dev mode | CCaaS |\n|---------------|-------|\n| You run the chaincode process locally (simpler setup) | Fablo runs the process in CCaaS container with chaincode volume mounted |\n| non-TLS only | supports TLS |\n| global per network | set for individual chaincodes |\n\n#### Peer dev mode\n\nThe simplest way to try Fablo with dev mode is as follows:\n\n1. Ensure you have `global.peerDevMode` set to `true` and `global.tls` set to `false` in `fablo-config.json`.\n2. Start the network with `fablo up`.\n   Because dev mode is enabled, chaincode containers don't start.\n   Instead, Fablo approves and commits chaincode definitions from the Fablo config file.\n3. Start the chaincode process locally.\n   Note: If you have multiple peers you want to use, you need to start a separate chaincode process for each peer.\n\n**For Node.js chaincode:**\n\nInstall npm dependencies and start the sample chaincode with:\n   ```bash\n   (cd chaincodes/chaincode-kv-node \u0026\u0026 nvm use \u0026\u0026 npm i \u0026\u0026 npm run start:watch)\n   ```\n   Now, when you update the chaincode source code, it will be automatically refreshed on the Hyperledger Fabric network.\n\nThe relevant scripts in `package.json` look like:\n\n```json\n  \"scripts\": {\n    ...\n    \"start:dev\": \"fabric-chaincode-node start --peer.address \\\"127.0.0.1:8541\\\" --chaincode-id-name \\\"chaincode1:0.0.1\\\" --tls.enabled false\",\n    \"start:watch\": \"nodemon --exec \\\"npm run start:dev\\\"\",\n    ...\n  },\n```\n\n**For Java Chaincode:**\n\nBuild and run the Java chaincode locally. As a sample, you can use the chaincode from the Fablo source code in the `samples/chaincodes/java-chaincode` directory. Ensure a proper relative path is provided in the Fablo config.\n\n```bash\ncd samples/chaincodes/java-chaincode\n./run-dev.sh\n```\n\nThe `run-dev.sh` script will:\n- Build the chaincode using Gradle's shadowJar task\n- Automatically detect the peer's IP address from the Docker container\n- Start the chaincode with debug logging enabled\n- Connect to the peer at port 7051\n\nFor local development and review:\n- The chaincode will run with the name `simple-asset:1.0`\n- Debug level logging is enabled via `CORE_CHAINCODE_LOGLEVEL=debug`\n- You can modify the Java code and rebuild/restart to see changes\n- The peer connection is automatically configured using the Docker container's IP\n\n### CCaaS to achieve chaincode hot reload\n\nTo achieve hot reload for both TLS and non-TLS setups, use the CCaaS feature in combination with `chaincodeMountPath` and `chaincodeStartCommand` parameters.\nThis way, you can start chaincode processes in CCaaS containers while having chaincode source code mounted, and reload when the code changes.\n\nThis approach has several benefits:\n* It works for both TLS and non-TLS\n* You can have only some chaincodes running in hot reload mode while others run in regular containers\n* Fablo manages starting chaincode processes\n\nYou can initialize a network with a sample setup by running the `fablo init` command:\n\n```\nfablo init dev node\n```\n\nThis produces the following chaincode configuration:\n\n```json\n  \"chaincodes\": [\n    {\n      \"name\": \"chaincode1\",\n      \"version\": \"0.0.1\",\n      \"channel\": \"my-channel1\",\n      \"lang\": \"ccaas\",\n      \"image\": \"hyperledger/fabric-nodeenv:${FABRIC_NODEENV_VERSION:-2.5}\",\n      \"chaincodeMountPath\": \"$CHAINCODES_BASE_DIR/chaincodes/chaincode-kv-node\",\n      \"chaincodeStartCommand\": \"npm run start:watch:ccaas\",\n      \"privateData\": []\n    }\n  ],\n  \"hooks\": {\n    \"postGenerate\": \"npm i --prefix ./chaincodes/chaincode-kv-node\"\n  }\n```\n\nYou can find a full end-to-end example in one of our test scripts [test-01-v3-simple.sh](e2e-network/docker/test-01-v3-simple.sh).\n\n\n## Channel scripts\n\n### channel help\n\n```bash\nfablo channel --help\n```\nUse it to list all available channel commands.\nCommands are generated using fablo-config.json to cover all cases (queries for each channel, organization, and peer).\n\n### channel list\n \n```bash\nfablo channel list org1 peer0\n```\nLists all channels for the given peer.\n\n### channel getinfo\n\n```bash\nfablo channel getinfo channel_name org1 peer0\n```\nPrints channel info, such as current block height for the given peer\n\n### channel fetch config\n\n```bash\nfablo channel fetch config channel_name org1 peer0 [file_name.json]\n```\n\nFetches the latest config block, decodes it, and writes it to a JSON file.\n\n### channel fetch raw block\n\n```bash\nfablo channel fetch \u003coldest|newest|block-number\u003e channel_name org1 peer0 [file_name.json]\n```\nFetches the oldest, newest, or a block with the given number, and writes it to a file.\n\n## Utility commands\n\n### version\n\n```bash\nfablo version [--verbose | -v]\n```\nPrints the current Fablo version.\nWith the optional `-v` or `--verbose` flag, it also prints supported Fablo and Hyperledger Fabric versions.\n\n### use\n\n```bash\nfablo use\n```   \n\nLists all available Fablo versions.\n\n### use \u003cversion-number\u003e\n\n```bash\nfablo use \u003cversion-number\u003e\n```   \n\nSwitches the current script to the selected version.\n\n## Fablo config\n\nThe Fablo config is a single JSON or YAML file that describes the desired Hyperledger Fabric network topology (network settings, CA, orderer, organizations, peers, channels, chaincodes).\nIt must be compatible with the [schema].\nYou can generate a basic config with the `./fablo init` command.\nSee the [samples](https://github.com/hyperledger-labs/fablo/blob/main/samples/) directory for more complex examples.\n\nThe basic structure of Fablo config file is as follows:\n\n```json\n{\n  \"$schema\": \"https://github.com/hyperledger-labs/fablo/releases/download/2.4.3/schema.json\",\n  \"global\": { ... },\n  \"orgs\": [ ... ],\n  \"channels\": [ ... ],\n  \"chaincodes\": [ ... ]\n}\n```\n\n### global\n\nExample:\n\n```json\n  \"global\": {\n    \"fabricVersion\": \"2.4.2\",\n    \"tls\": false,\n    \"peerDevMode\": false,\n    \"monitoring\": {\n      \"loglevel\": \"debug\"\n    },\n    \"tools\": {\n      \"explorer\": false\n    }\n  },\n```\n\n### orgs\n\nExample:\n\n```json\n  \"orgs\": [\n    {\n      \"organization\": {\n        \"name\": \"Org1\",\n        \"domain\": \"org1.example.com\"\n      },\n      \"peer\": {\n        \"instances\": 2,\n        \"db\": \"LevelDb\"\n      },\n      \"orderers\": [{\n        \"groupName\": \"group1\",\n        \"type\": \"raft\",\n        \"instances\": 3\n      }],\n      \"tools\": {\n        \"fabloRest\": true,\n        \"explorer\": true\n      }\n    },\n    ...\n  ],\n```\n\nOther available parameters for entries in the `orgs` array are:\n\n * `organization.mspName` (default: `organization.name + 'MSP'`)\n * `ca.prefix` (default: `ca`)\n * `ca.db` (default: `sqlite`, other: `postgres`)\n * `peer.prefix` (default: `peer`)\n * `peer.anchorPeerInstances` (default: `1`)\n * `orderers` (defaults to empty: `[]`)\n * `tools.explorer` - whether to run Blockchain Explorer for the organization (default: `false`)\n * `tools.fabloRest` - whether to run Fablo REST for the organization (default: `false`)\n \n### property `peer.db`:\n- Can be `LevelDb` (default) or `CouchDb`.  \n\n### property `orderers`:\n- Is optional as some organizations may have orderers defined, but others don't.\n- At least one orderer group is required to run the Fabric network (requirement is validated before run).\n- If you want to spread orderers in a group between many organizations, use the same `groupName` in every group definition.\n- The property `orderers.type` can be `solo` or `raft`. We do not support the Kafka orderer.\n\n### channels\n\nExample:\n\n```json\n  \"channels\": [\n    {\n      \"name\": \"my-channel1\",\n      \"groupName\": \"group1\",      \n      \"orgs\": [\n        {\n          \"name\": \"Org1\",\n          \"peers\": [\n            \"peer0\",\n            \"peer1\"\n          ]\n        },\n        {\n          \"name\": \"Org2\",\n          \"peers\": [\n            \"peer0\"\n          ]\n        }\n      ]\n    },\n    ...\n  ],\n```\n\n- Property `groupName` is optional (defaults to the first orderer group found). If you want to handle a channel with a different orderer group, define it in `orgs` and pass its name here. \n\n### chaincodes\n\nExample:\n\n```json\n  \"chaincodes\": [\n    {\n      \"name\": \"chaincode1\",\n      \"version\": \"0.0.1\",\n      \"lang\": \"node\",\n      \"channel\": \"my-channel1\",\n      \"directory\": \"./chaincodes/chaincode-kv-node\",\n      \"privateData\": {\n        \"name\": \"org1-collection\",\n        \"orgNames\": [\"Org1\"]\n      }\n    },\n    {\n      \"name\": \"chaincode2\",\n      \"version\": \"0.0.1\",\n      \"lang\": \"java\",\n      \"channel\": \"my-channel2\"\n    }\n  ]\n```\n\nThe property `lang` can be `golang`, `java`, `node`, or `ccaas`.\n\nThe `privateData` parameter is optional. You don't need to define the private data collection for the chaincode. By default, there is none (just the implicit private data collection which is default in Fabric).\n\nOther available parameters for entries in the `chaincodes` array are:\n\n* `init` - initialization arguments (for Hyperledger Fabric below 2.0; default: `{\"Args\":[]}`)\n* `initRequired` - whether the chaincode requires an initialization transaction (for Hyperledger Fabric 2.0 and greater; default: `false`)\n* `endorsement` - the endorsement policy for the chaincode (if missing for Hyperledger Fabric 2.0 and greater, there is no default value - Hyperledger by default will take the majority of organizations)\n* `chaincodeMountPath` (`ccaas` only) - chaincode mount path. If provided, the given directory is mounted inside the Docker container and becomes the container working directory.\n* `chaincodeStartCommand` (`ccaas` only) - chaincode start command. If provided, this command is used as the Docker container command.\n\n\n\n### hooks\n\nHooks in Fablo are Bash commands to be executed after specific events.\nSupported hooks:\n\n- `postGenerate` — executed after the network config is generated (after `./fablo generate`, executed separately or automatically by `./fablo up`).\n- `postStart` — executed after the network is started (after `./fablo up` or `./fablo start`).\n\nExample `postGenerate` hook that changes `MaxMessageCount` to 1 in generated Hyperledger Fabric config:\n\n```json\n  \"hooks\": {\n    \"postGenerate\": \"perl -i -pe 's/MaxMessageCount: 10/MaxMessageCount: 1/g' \\\"./fablo-target/fabric-config/configtx.yaml\\\"\"\n  }\n```\n\nExample `postStart` hook that waits for peers to be ready or performs any additional bootstrap actions:\n\n```json\n  \"hooks\": {\n    \"postStart\": \"echo 'Network started' \u0026\u0026 ./fablo-target/fabric-docker.sh channel list org1 peer0\"\n  }\n```\n\nGenerated hooks are saved in `fablo-target/hooks`.\n\n\n### Sample YAML config file\n\n```yaml\n---\n\"$schema\": https://github.com/hyperledger-labs/fablo/releases/download/2.4.3/schema.json\nglobal:\n  fabricVersion: 2.4.2\n  tls: false\norgs:\n  - organization:\n      name: Orderer\n      domain: root.com\n    orderers:\n      - groupName: group1\n        prefix: orderer\n        type: solo\n        instances: 1 \n  - organization:\n      name: Org1\n      domain: org1.example.com\n      tools:\n        fabloRest: true\n        explorer: true\n    peer:\n      instances: 2\n  - organization:\n      name: Org2\n      domain: org2.example.com\n    peer:\n      instances: 1\nchannels:\n  - name: my-channel1\n    orgs:\n      - name: Org1\n        peers:\n          - peer0\n          - peer1\n      - name: Org2\n        peers:\n          - peer0\nchaincodes:\n  - name: and-policy-chaincode\n    version: 0.0.1\n    lang: node\n    channel: my-channel1\n    init: '{\"Args\":[]}'\n    endorsement: AND('Org1MSP.member', 'Org2MSP.member')\n    directory: \"./chaincodes/chaincode-kv-node\"\n    privateData:\n      - name: org1-collection\n        orgNames:\n          - Org1\n```\n\n## Kubernetes support\n\nTODO\n\n## Other features\n\n### Connection profiles\n\nFablo will generate connection profiles for each organization defined in the configuration.\nYou can find them in the `fablo-target/fablo-config/connection-profiles` directory in `json` and `yaml` format.\n\n### REST API\n\nFablo is integrated with a simple REST API for CA and chaincodes, supported by [Fablo REST](https://github.com/fablo-io/fablo-rest).\nTo use it, set `\"tools\": { \"fabloRest\": true }` for your organization.\nVisit the [Fablo REST](https://github.com/fablo-io/fablo-rest) project for more documentation.\n\n### Blockchain Explorer\n\nFablo can run [Blockchain Explorer](https://github.com/hyperledger/blockchain-explorer) for you.\nSet `\"tools\": { \"explorer\": true }` for your organization if you want to use it per organization, or set the same value in the `global` section of the config if you want to use one global Explorer for all organizations.\n\n## Contributing\n\nWe'd love to have you contribute! Please refer to our [contribution guidelines](https://github.com/hyperledger-labs/fablo/blob/main/CONTRIBUTING.md) for details.\n\n## Testimonials\n\nFablo was originally created at [SoftwareMill](https://softwaremill.com) by [@Hejwo](https://github.com/Hejwo/) and [@dzikowski](https://github.com/dzikowski/).\nIn December 2021, Fablo joined [Hyperledger Labs](https://labs.hyperledger.org/).\n\n## Talks\n* [Simplifying Fabric Dev: New Features in Fablo](https://www.youtube.com/watch?v=5yn3_g6Cybw) by [@dzikowski](https://github.com/dzikowski), [dpereowei](https://github.com/dpereowei), and [@OsamaRab3](https://github.com/OsamaRab3) (November 2025)\n* [Kick-off your Hyperledger Fabric network](https://www.youtube.com/watch?v=JqPNozCtHkQ) by [@Hejwo](https://github.com/Hejwo) (Feburary 2021; Fablo was called \"Fabrica\" at that time)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyperledger-labs%2Ffablo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhyperledger-labs%2Ffablo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyperledger-labs%2Ffablo/lists"}