{"id":13478042,"url":"https://github.com/txpipe/oura","last_synced_at":"2026-06-15T02:06:12.833Z","repository":{"id":37264097,"uuid":"432865759","full_name":"txpipe/oura","owner":"txpipe","description":"The tail of Cardano","archived":false,"fork":false,"pushed_at":"2025-03-25T18:03:37.000Z","size":5816,"stargazers_count":261,"open_issues_count":77,"forks_count":72,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-03-25T19:22:25.363Z","etag":null,"topics":["blockchain","cardano","elasticsearch","kafka","ouroboros","redis","rust"],"latest_commit_sha":null,"homepage":"https://oura.txpipe.io","language":"Rust","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/txpipe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-29T01:08:22.000Z","updated_at":"2025-03-25T18:03:47.000Z","dependencies_parsed_at":"2023-02-18T19:15:22.926Z","dependency_job_id":"e419b480-129a-458f-97d6-61eb45078f8d","html_url":"https://github.com/txpipe/oura","commit_stats":{"total_commits":533,"total_committers":30,"mean_commits":"17.766666666666666","dds":"0.40150093808630394","last_synced_commit":"ed54b3290bba81c047eb3bc482f5c93903b98195"},"previous_names":[],"tags_count":54,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txpipe%2Foura","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txpipe%2Foura/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txpipe%2Foura/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txpipe%2Foura/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/txpipe","download_url":"https://codeload.github.com/txpipe/oura/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245802194,"owners_count":20674605,"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","cardano","elasticsearch","kafka","ouroboros","redis","rust"],"created_at":"2024-07-31T16:01:51.656Z","updated_at":"2026-06-15T02:06:12.827Z","avatar_url":"https://github.com/txpipe.png","language":"Rust","funding_links":[],"categories":["Rust","Tools"],"sub_categories":["Explorer Tools"],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"assets/logo.svg\" alt=\"Oura\" width=\"500\"\u003e\n    \u003chr /\u003e\n        \u003ch2 align=\"center\" style=\"border-bottom: none\"\u003eThe tail of Cardano\u003c/h2\u003e\n        \u003ca href=\"https://github.com/txpipe/oura/blob/main/LICENSE\"\u003e\n           \u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/txpipe/oura\" /\u003e\n        \u003c/a\u003e\n        \u003ca href=\"https://crates.io/crates/oura\"\u003e\n           \u003cimg alt=\"Crates.io\" src=\"https://img.shields.io/crates/v/oura\" /\u003e\n        \u003c/a\u003e\n        \u003ca href=\"https://github.com/txpipe/oura/actions/workflows/validate.yml\"\u003e\n            \u003cimg alt=\"GitHub Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/txpipe/oura/validate.yml\" /\u003e\n        \u003c/a\u003e\n    \u003chr/\u003e\n\u003c/div\u003e\n\n\u003e **Warning**\n\u003e The `main` branch is now tracking **V2**, a complete overhaul of the processing pipeline with multiple breaking changes. V1 is now considered legacy and will only receive critical security updates. We strongly encourage all users to migrate to V2 for the latest features, performance improvements, and ongoing support. For information on V1, please refer to the `lts/v1` branch.\n\n## Introduction\n\nWe have tools to \"explore\" the Cardano blockchain, which are useful when you know what you're looking for. We argue that there's a different, complementary use-case which is to \"observe\" the blockchain and react to particular event patterns.\n\n_Oura_ is a rust-native implementation of a pipeline that connects to the tip of a Cardano node through a combination of _Ouroboros_ mini-protocol (using either a unix socket or tcp bearer), filters the events that match a particular pattern and then submits a succinct, self-contained payload to pluggable observers called \"sinks\".\n\nCheck our [documentation](https://docs.txpipe.io/oura/v2) for detailed information on how to start working with _Oura_.\n\n## Etymology\n\nThe name of the tool is inspired by the `tail` command available in unix-like systems which is used to display the tail end of a text file or piped data. Cardano's consensus protocol name, _Ouroboros_, is a reference to the ancient symbol depicting a serpent or dragon eating its own tail, which means \"tail eating\". \"Oura\" is the ancient greek word for \"tail\".\n\n## Under the Hood\n\nAll the heavy lifting required to communicate with the Cardano node is done by the [Pallas](https://github.com/txpipe/pallas) library, which provides an implementation of the Ouroboros multiplexer and a few of the required mini-protocol state-machines (ChainSync and LocalState in particular).\n\nThe data pipeline is implemented by the [Gasket](https://github.com/construkts/gasket-rs) library which provides a framework for building staged, event-driven applications. Under this abstraction, each component of the pipeline (aka: _Stage_) runs in its own thread and communicates with other stages by sending messages (very similar to the _Actor pattern_).\n\n## Use Cases\n\n### CLI to Watch Live Transactions\n\nYou can run `oura watch \u003csocket\u003e` to print TX data into the terminal from the tip of a local or remote node. It can be useful as a debugging tool for developers or if you're just curious to see what's going on in the network (for example, to see airdrops as they happen or oracles posting new information).\n\n### As a Bridge to Other Persistence Mechanisms\n\nSimilar to the well-known db-sync tool provided by IOHK, _Oura_ can be used as a daemon to follow a node and output the data into a different data storage technology more suited for your final use case. The main difference with db-sync is that _Oura_ was designed for easy integration with data-streaming pipelines instead of relational databases.\n\nGiven its small memory / cpu footprint, _Oura_ can be deployed side-by-side with your Cardano node even in resource-constrained environments, such as Raspberry PIs.\n\n### As A Trigger Of Custom Actions\n\n_Oura_ running in `daemon` mode can be configured to use custom filters to pinpoint particular transaction patterns and trigger actions whenever it finds a match. For example: send an email when a particular policy / asset combination appears in a transaction; call an AWS Lambda function when a wallet delegates to a particular pool; send a http-call to a webhook each time a metadata key appears in the TX payload;\n\n### As a Library for Custom Scenarios\n\nIf the available out-of-the-box features don't satisfy your particular use case, _Oura_ can be used a library in your Rust project to setup tailor-made pipelines. Each component (sources, filters, sinks, etc) in _Oura_ aims at being self-contained and reusable. For example, custom filters and sinks can be built while reusing the existing sources.\n\n## How it Works\n\nOura is in its essence just a pipeline for processing events. Each stage of the pipeline fulfills a different role:\n\n- Source Stages: are in charge of pulling data from the blockchain and mapping the raw blocks into smaller, more granular events. Each event is then sent through the output port of the stage for further processing.\n- Filter Stages: receive individual events from the source stage and apply some sort of transformation to each one. The transformations applied will depend on the particular use case, but they usually revolve around selecting relevant events and enriching them with extra information.\n- Sink Stages: receive the final events from the filter stage and submits the payload to some external system, database or service for further processing.\n\n![diagram](assets/diagram.png)\n\n## Feature Status\n\n- Data Types\n  - CBOR blocks\n  - CBOR txs\n  - Oura v1 model (for backward-compatibility)\n  - Parsed Txs (structured objects with all tx data)\n  - Generic JSON (any kind of JSON values)\n- Sources\n  - Node-to-client (n2c)\n  - Node-to-node (n2n)\n  - S3\n  - Hydra\n  - Mithril\n  - Utxorpc\n- Sinks\n  - AWS Lambda\n  - AWS S3\n  - AWS SQS\n  - Elasticsearch\n  - File Rotate\n  - GCP Cloud Function\n  - GCP PubSub\n  - Kafka\n  - RabbitMQ\n  - Redis\n  - SQL Databases\n  - Stdout\n  - Webhook\n  - Terminal\n- Filters\n  - Into JSON\n  - Parse CBOR\n  - Rollback Buffer\n  - Split Block\n  - Wasm Plugin\n  - Select\n  - Legacy V1\n- Other\n  - stateful chain cursor to recover from restarts\n  - pipeline metrics to track the progress and performance\n\n## Known Limitations\n\n- Oura reads events from minted blocks / transactions. Support for querying the mempool is not yet implemented.\n\n## Contributing\n\nAll contributions are welcome, but please read the [contributing guide](.github/CONTRIBUTING.md#scope) of the project before starting to code.\n\n## License\n\nThis project is licensed under the Apache-2.0 license. Please see the [LICENSE](LICENSE.md) file for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftxpipe%2Foura","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftxpipe%2Foura","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftxpipe%2Foura/lists"}