{"id":13815586,"url":"https://github.com/ruuda/rcl","last_synced_at":"2026-02-28T18:11:02.158Z","repository":{"id":187536792,"uuid":"677095043","full_name":"ruuda/rcl","owner":"ruuda","description":"A reasonable configuration language","archived":false,"fork":false,"pushed_at":"2026-02-23T23:29:05.000Z","size":2162,"stargazers_count":371,"open_issues_count":13,"forks_count":14,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-02-24T05:51:43.144Z","etag":null,"topics":["configuration","configuration-language","json","nix","python","rust"],"latest_commit_sha":null,"homepage":"https://rcl-lang.org","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/ruuda.png","metadata":{"files":{"readme":"README.md","changelog":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-08-10T18:14:05.000Z","updated_at":"2026-02-23T22:48:31.000Z","dependencies_parsed_at":"2024-02-10T00:23:30.017Z","dependency_job_id":"13db75c9-880e-4f35-91a0-2e4606eed4ca","html_url":"https://github.com/ruuda/rcl","commit_stats":{"total_commits":1252,"total_committers":3,"mean_commits":417.3333333333333,"dds":"0.0031948881789137795","last_synced_commit":"39272f3e3e47b536670300d9b7438f283795496e"},"previous_names":["ruuda/rcl"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/ruuda/rcl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Frcl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Frcl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Frcl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Frcl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruuda","download_url":"https://codeload.github.com/ruuda/rcl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Frcl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29946467,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T17:57:52.716Z","status":"ssl_error","status_checked_at":"2026-02-28T17:57:31.974Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["configuration","configuration-language","json","nix","python","rust"],"created_at":"2024-08-04T04:03:37.784Z","updated_at":"2026-02-28T18:11:02.144Z","avatar_url":"https://github.com/ruuda.png","language":"Rust","readme":"\u003ch1 align=\"center\"\u003eThe RCL Configuration Language\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e ·\n\u003ca href=\"https://docs.ruuda.nl/rcl/\"\u003eDocumentation\u003c/a\u003e ·\n\u003ca href=\"./docs/changelog.md\"\u003eChangelog\u003c/a\u003e ·\n\u003ca href=\"https://rcl-lang.org/#try-it-yourself\"\u003eOnline Playground\u003c/a\u003e\n\u003c/p\u003e\n\nRCL is a domain-specific language for generating configuration files and\nquerying json documents. It is a superset of json that extends it into a simple,\ngradually typed, functional programming language that resembles Python and Nix.\n\nRCL can be used through the [`rcl`][cmd] command-line tool that can export\ndocuments to json, yaml, toml, [and more][output]. It can also be used through\na native Python module, with an interface similar to the `json` module.\n\n## About\n\nRCL solves the following problems:\n\n * Copy-pasted yaml blocks that differ by a single value.\n * Broken configs due to whitespace and escaping footguns in templating engines.\n * Drift between tools due to lack of a single source of truth.\n * Struggling to remember `jq` syntax.\n\nIt does that as follows:\n\n * **A real language.**\n   Use variables, loops, imports, and functions to eliminate duplication.\n * **Familiar syntax.**\n   Have you used Python, TypeScript, or Rust before? Then you will find RCL\n   obvious to read and natural to write.\n * **Generate rather than template.**\n   Manipulate data structures, not strings.\n   Generate correct json, yaml, and toml.\n * **Built to integrate.**\n   Generate configs for tools that do not natively talk to each other, all\n   from a single source of truth. Integrate with your existing build tools,\n   use the Python module, or the built-in [`rcl build`][cmd-build] to update\n   generated files.\n * **Gradual types.**\n   Add type annotations where they help to eliminate bugs and make code\n   self-documenting, omit them in straightforward code.\n * **Built-in json queries.**\n   A language for manipulating structured data makes a pretty good query tool.\n   Run map and filter pipelines straight from your terminal.\n\n[cmd]:       https://docs.ruuda.nl/rcl/rcl/\n[cmd-build]: https://docs.ruuda.nl/rcl/rcl_build/#\n[output]:    https://docs.ruuda.nl/rcl/rcl_evaluate/#-o-output-format\n\n## Example\n\nGiven this input:\n\n```rcl\n{\n  // Generate backup buckets for each database and retention period.\n  backup_buckets = [\n    let retention_days = { hourly = 4, daily = 30, monthly = 365 };\n    for database in [\"alpha\", \"bravo\"]:\n    for period, days in retention_days:\n    {\n      name = f\"{database}-{period}\",\n      region = \"eu-west\",\n      lifecycle_policy = { delete_after_seconds = days * 24 * 3600 },\n    }\n  ],\n}\n```\n\nRCL generates:\n\n```jsonc\n{\n   \"backup_buckets\": [\n      {\n         \"name\": \"alpha-hourly\",\n         \"region\": \"eu-west\",\n         \"lifecycle_policy\": { \"delete_after_seconds\": 345600 }\n      },\n      {\n         \"name\": \"alpha-daily\",\n         \"region\": \"eu-west\",\n         \"lifecycle_policy\": { \"delete_after_seconds\": 2592000 }\n      },\n      // And 4 similar entries, omitted here for brevity.\n   ]\n}\n```\n\nFor an interactive demo in your browser, see \u003chttps://rcl-lang.org\u003e.\n\n## Getting started\n\nAfter the interactive examples [on the website](https://rcl-lang.org/),\n[the manual](https://docs.ruuda.nl/rcl/) is the best resource for further\ninformation. The most useful chapters to get started:\n\n * [Installation](https://docs.ruuda.nl/rcl/installation/)\n * [Tutorial](https://docs.ruuda.nl/rcl/tutorial/)\n * [Syntax guide](https://docs.ruuda.nl/rcl/syntax/)\n\nYou may also find the examples in the `examples` directory instructive.\nSome helpful commands after a clone:\n```bash\n# Build\ncargo build --release\n\n# Print usage\ntarget/release/rcl\ntarget/release/rcl eval --help\n\n# Evaluate an RCL expression to json\ntarget/release/rcl eval --format=json examples/tags.rcl\n\n# Query an RCL or json document\ntarget/release/rcl query examples/tags.rcl input.tags.ams01\n\n# Autoformat and highlight an RCL expression (non-destructive, prints to stdout)\ntarget/release/rcl fmt examples/tags.rcl\n```\n\n## Status\n\nRCL is usable and useful, well-tested, and well-documented. It is still pre-1.0,\nthough backwards-incompatible changes have been rare in the past years. Syntax\nhighlighting is available for major editors like Vim, Emacs, Helix, and Zed.\nRCL is a community project without commercial support.\n\n## Support RCL\n\nOne thing that holds RCL back from being useful to more people is the lack of\nwidespread support for syntax highlighting on platforms such as GitHub. If RCL\nis useful to you, you can help by using RCL publicly in a GitHub repository\n[to demonstrate traction][linguist]. Use it seriously of course, please don’t\ngame the metric. Other things you can help with are getting RCL packaged for\nyour favorite package manager, and developing syntax highlighting for your\nfavorite editor if it is not yet supported.\n\n[linguist]: https://github.com/github-linguist/linguist/blob/4ac734c15a96f9e16fd12330d0cb8de82274f700/CONTRIBUTING.md#adding-a-language\n\n## Development\n\nTo get started hacking on RCL, see [`docs/development.md`][dev-docs].\n\n[dev-docs]: https://docs.ruuda.nl/rcl/development/\n\n## License\n\nRCL is licensed under the [Apache 2.0][apache2] license. It may be used in\nfree software as well as closed-source applications, both for commercial and\nnon-commercial use under the conditions given in the license. If you want to\nuse RCL in your GPLv2-licensed software, you can add an [exception][except]\nto your copyright notice. Please do not open an issue if you disagree with the\nchoice of license.\n\n[apache2]: https://www.apache.org/licenses/LICENSE-2.0\n[except]:  https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs\n","funding_links":[],"categories":["Rust","Configuration Management"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruuda%2Frcl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruuda%2Frcl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruuda%2Frcl/lists"}